package org.easy.eao.support;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * 分页对象，用于存储分页信息与页面内的数据
 * 
 * @author Frank
 */
public class Page<T> implements Iterable<T>, Iterator<T>, Serializable {

	private static final long serialVersionUID = 6141397074402785607L;

	/** 当前页第一条数据的位置,从0开始 */
	private int start;
	/** 每页记录数 */
	private int size;
	/** 当前页中的数据集 */
	private List<T> result;
	/** 总记录数 */
	private int count;

	/**
	 * 构造方法，只构造空页
	 */
	public Page() {
		this.result = new ArrayList<T>();
	}

	/**
	 * 默认构造方法
	 * 
	 * @param start 本页第一项数据的起始位置
	 * @param totalSize 总记录数
	 * @param pageSize 本页容量
	 * @param result 本页包含的数据集
	 */
	public Page(int start, int totalSize, int pageSize, List<T> result) {
		this.size = pageSize;
		this.start = start;
		this.count = totalSize;
		this.result = result;
	}

	/**
	 * 构造方法
	 * 
	 * @param start 本页第一项数据的起始位置
	 * @param totalSize 总记录数
	 * @param pageSize 本页容量
	 * @param result 本页包含的数据集
	 */
	public Page(int start, long totalSize, int pageSize, List<T> result) {
		this.size = pageSize;
		this.start = start;
		this.count = Long.valueOf(totalSize).intValue();
		this.result = result;
	}

	/**
	 * 获取 总记录数
	 */
	public int getCount() {
		return this.count;
	}

	/**
	 * 获取 总页数
	 */
	public int getPageCount() {
		if (count % size == 0)
			return count / size;
		else
			return count / size + 1;
	}

	/**
	 * 获得 最后一页的页面
	 * @return
	 */
	public int getLastPage() {
		return getPageCount();
	}

	/**
	 * 获取 每页记录数
	 */
	public int getSize() {
		return size;
	}

	/**
	 * 获取 记录开始位置<br>
	 * 相对于数据表的位置，从0开始
	 */
	public int getStart() {
		return start;
	}

	/**
	 * 获取 当前页中的数据集
	 */
	public List<T> getResult() {
		return result;
	}

	@SuppressWarnings("unchecked")
	public T[] arrayResult() {
		return (T[]) result.toArray();
	}

	/**
	 * 获取 当前页中的数据集合大小
	 */
	public int getResultSize() {
		return this.result.size();
	}

	/**
	 * 取当前页码,页码从1开始
	 */
	public int getNumber() {
		return (start / size) + 1;
	}

	/**
	 * 是否有下一页
	 */
	public boolean isHasNextPage() {
		return this.getNumber() < this.getPageCount();
	}
	
	/**
	 * 获得下一页的页码
	 * @return
	 */
	public int getNextPage() {
		return getNumber() + 1;
	}

	/**
	 * 是否有上一页
	 */
	public boolean isHasPreviousPage() {
		return (this.getNumber() > 1);
	}
	
	/**
	 * 获得上一页的页码
	 * @return
	 */
	public int getPreviousPage() {
		return getNumber() - 1;
	}

	/**
	 * 获取任一页第一条数据的位置,从0开始
	 */
	public static int getStartOfPage(int pageNo, int pageSize) {
		return (pageNo - 1) * pageSize;
	}

	// Setter methods ...

	public void setSize(int pageSize) {
		this.size = pageSize;
	}

	public void setResult(List<T> result) {
		this.result = result;
	}

	public void setStart(int start) {
		this.start = start;
	}

	public void setCount(int totalCount) {
		this.count = totalCount;
	}

	@Override
	public Iterator<T> iterator() {
		return result.iterator();
	}

	// implements Iterator

	private Iterator<T> iterator;

	private void beforeIterator() {
		if (iterator == null) {
			iterator = iterator();
		}
	}

	@Override
	public T next() {
		beforeIterator();
		return iterator.next();
	}

	@Override
	public void remove() {
		beforeIterator();
		iterator.remove();
	}

	@Override
	public boolean hasNext() {
		beforeIterator();
		return iterator.hasNext();
	}

}